2.3 Systém študentskej databázy
Oboznámime čitateľa s niekoľkými jednoduchými metódami návrhu programu: vývojový diagram, štrukturogram, Jacksonov diagram a slovný popis. Ako príklad uvedieme návrh algoritmu tej istej úlohy pomocou každého z nich. Nech našou úlohou je:
Úloha
Vypracujme program pre tvorbu databázy známok študentskej skupiny
|
Úloha v tejto forme je pomerne nepresná. Vo všeobecnom prípade človek počas analýzy zistí nedostatky a nepresnosti v zadaní úlohy. V takomto prípade treba spresniť úlohu. Kým nemáme hotový celý algoritmus a dátovú štruktúru, nemali by sme sa viazať na konkrétny programovací jazyk. Napríklad v našom prípade vznikajú nasledujúce otázky: aké majú predmety študenti. podľa akého znaku chceme rozlišovať jednotlivých študentov (napr. dvaja rôzni študenti môžu mať rovnaké meno). Po vyjasnení nejasností spresňujeme našu úlohu nasledovne:
Úloha
Máme zostrojiť program pre tvorbu databázy známok študentskej skupiny. Pre zjednodušenie úlohy predpokladáme, že majú iba jeden predmet - Základy programovania. V databáze o každom študentovi chceme mať nasledujúce údaje:
Identifikátor študenta (6 číslic, pre každého študenta iné).
Meno študenta (maximálne 30 písmen).
Známka zo Základov programovania (číslo medzi 1 až 5).
Program si má vypýtať identifikátor študenta a na základe neho má vypísať meno študenta a jeho známku. Ak nie je v databáze taký študent, má vydať chybové hlásenie. Potom nech opäť pýta identifikátor študenta a znovu vypíše meno a známku študenta. Proces sa má opakovať do tej doby, kým ako identifikátor nezadáme znak "*". Po zadaní tohto znaku nech program ukončí svoju činnosť.
|
Najprv sa pokúsme určiť tie údaje, ktoré náš algoritmus má poznať. Algoritmus musí poznať všetky vyššie spomenuté údaje, v opačnom prípade by nedokázal ich nájsť.
 |
Potrebujeme ešte jeden ďalší identifikátor, ktorý zadá užívateľ programu a ktorý sa bude porovnávať.
Pokúsme sa vytvoriť algoritmus riešenia našej úlohy. Napríklad:
- Vyžiadaj identifikátor študenta!
- Kým identifikátor sa nerovná "*", rob nasledujúce:
- Vyhľadaj údaje študenta v tabuľke!
- Ak ich nájdeš,
- Vypíš meno a známku študenta
V opačnom prípade
- Vydaj chybové hlásenie!
- Vyžiadaj identifikátor ďalšieho študenta!
- Rozlúč sa!
|
A to už je skoro program. Prvý a tretí bod sa vykoná iba raz. Druhý bod má tri podbody, ktoré sa budú opakovane vykonávať, kým identifikátor študenta nie je "*". Počas jednorázového vykonania druhého bodu - časti 2.1 a 2.3 sa vykonajú iba raz a bod 2.2 vykoná podľa podmienky jednu z dvoch možných činností.
Keď už algoritmus máme vytvorený, nezostáva nám nič iné, len ho implementovať, t.j. kódovať úlohu, čo môžeme urobiť v ľubovolnom programovacom jazyku. Samozrejme každý programovací jazyk je lepší na niečo iné. Niečo sa dá ľahšie urobiť v Pascale niečo v Clipperi. Príkaz "Vyhľadaj údaje študenta v tabuľke!" je trošku zložitejšou úlohou, ktorá sa nedá realizovať jedným príkazom ani vo vyšších programovacích jazykoch.
Kódovať prvý bod nie je problém, lebo načítať 6 číslic je v ľubovolnom vyššom programovacom jazyku hračkou. Ani druhý bod nie je problematický, lebo prostriedky tvorby cyklov sú v každom jazyku (vykonávať skupinu príkazov, kým istá podmienka nie je splnená). Nad bodom 2.1 už sa musíme zamyslieť. Ako máme vyhľadať údaje študenta? Kde sa presne nachádzajú? Tu už si musíme uvedomiť, že pýtať sa budeme ne rozumného tvora ale počítač. To bolo predsa naším cieľom: chceme odbremeniť ľudí od zapamätania si údajov a ich vyhľadávania. Aby sme dotyčné údaje mohli vyhľadať, museli sme ich niekedy predtým uložiť. Pre uloženie údajov máme prostriedky a programátor musí dobre vedieť aké. Údaje najčastejšie ukladáme na pevný disk. Vyhľadávanie nebudeme podrobne preberať, budeme predpokladať, že bod 2.1 náš program zvláda. Bod 2.2 závisí od jednej podmienky, čo sa tiež dá v každom programovacom jazyku jednoducho kódovať. Ostatné príkazy sú výpisy na obrazovku, čo tiež nie je ťažkou úlohou.
Pozrime sa na algoritmus napísaný v jazyku Turbo Pascal:
 |
Toto je teda fragment Pascalovského programu - nie sú uvedené iba deklarácia údajov a popis podprogramu Hladaj (v Pascale v názvoch údajov nemôžu byť diakritické písmená). Tu sa budeme snažiť vysvetliť logiku a patričné Pascalovské príkazy popíšeme neskôr:
- Identifikator a Student sú rôzne časti pamäte, ktoré majú svoje meno. Identifikator musíme pripraviť na príjem 6 číslic resp. znaku '*' (identifikátor študentov) a časť Student zase všetky údaje jedného študenta (jeden riadok z tabuľky). Student.Znamka poukazuje na Znamku. Pomenované časti pamäte, ako napr. v našom príklade Identifikator a Student, v programovaní sa nazývajú premenné.
- Príkaz ReadLn(Identifikátor) čaká, kým užívateľ nezadá identifikátor študenta. Zadanú hodnotu uloží do premennej Identifikator.
- Príkaz cyklu v Pascale je While podmienka Do … (Kým podmienka Rob …). Kým podmienka je splnená opakovane vykonáva príkazy medzi Begin a End. Tu podmienkou je Identifikator <> '*', teda kým načítaná hodnota sa nerovná '*'.
- Pozrime sa teraz na príkaz Hladaj(Identifikator,Student,Je). Pomenovanú časť programu nazývame podprogramom. Podprogram môže mať parametre. Podprogram sa vyvoláva jeho menom. V našom príklade meno podprogramu je Hladaj a parametrami sú Identifikator, Student a Je. Úlohou podprogramu je aby na základe daného identifikátora našiel všetky údaje študenta, t.j. podľa hodnoty premennej Identifikator hľadal v tabuľke Student (nech je to kdekoľvek) a ak nájde, nech údaje uloží do patričnej časti pamäte. Parameter Je bude obsahovať informáciu o tom, čí hľadanie bolo úspešné alebo nie.
Celkom prvý príkaz, ReadLn(Identifikator), je tiež podprogramom, lenže tento príkaz je súčasťou programovacieho jazyka Turbo Pascal. Podprogram Hladaj by sme mali napísať sami, ale teraz to robiť nebudeme.
- Príkaz If podmienka Then ... Else ... je rozvetviaci sa príkaz (Ak podmienka Potom ... Inak ...). Ak podmienka je splnená, potom príkaz po Then sa vykoná, v opačnom prípade - príkaz po Else. Ak študent sa nachádza v tabuľke, potom program vypíše jeho meno a jeho známku, v opačnom prípade vydá chybové hlásenie, že taký študent sa nenachádza v databáze.
- Príkaz WriteLn zobrazí údaje uvedené v zátvorke.
|